package arithmetic;

import org.junit.jupiter.api.Test;

import java.util.Arrays;

/**
 * 一个自然数，以数组的形式展示，我们做加一的操作
 *
 * @author gaojie
 * @date 2022-03-23
 */
public class PlusOne {

    @Test
    void test() {
        assert Arrays.equals(fun(new int[]{1}), new int[]{2});
        assert Arrays.equals(fun(new int[]{1, 2, 3}), new int[]{1, 2, 4});
        assert Arrays.equals(fun(new int[]{0}), new int[]{1});
        assert Arrays.equals(fun(new int[]{9}), new int[]{1, 0});
        assert Arrays.equals(fun(new int[]{9}), new int[]{1, 0});
    }

    /**
     * 1.若最后一位不为9，则直接+1，结束
     * 2.1.若最后一位为9，则改为0，标记需要进位
     * 2.2.然后向前依次循环，只到不为9，则+1，标记为不需要进位，且跳出循环
     * 3.1.在判断进位标志，若不需要进位，则返回原数组
     * 3.2.若需要进位，则创建一个新数组，第1位为1，然后后面的都是0，不用管
     */
    int[] fun(int[] digits) {
        final int length = digits.length;
        if (digits[length - 1] == 9) {
            digits[length - 1] = 0;
            boolean add = true;
            for (int i = length - 2; i >= 0; i--) {
                if (digits[i] == 9) {
                    digits[i] = 0;
                } else {
                    digits[i] = digits[i] + 1;
                    add = false;
                    break;
                }
            }
            if (add) {
                int[] ints = new int[length + 1];
                ints[0] = 1;
                return ints;
            }
        } else {
            digits[length - 1]++;
        }
        return digits;
    }
}
